package com.atguigu.tingshu.album.service.impl;

import com.atguigu.tingshu.album.mapper.AlbumAttributeValueMapper;
import com.atguigu.tingshu.album.mapper.AlbumInfoMapper;
import com.atguigu.tingshu.album.mapper.AlbumStatMapper;
import com.atguigu.tingshu.album.service.AlbumInfoService;
import com.atguigu.tingshu.common.constant.SystemConstant;
import com.atguigu.tingshu.model.album.AlbumAttributeValue;
import com.atguigu.tingshu.model.album.AlbumInfo;
import com.atguigu.tingshu.model.album.AlbumStat;
import com.atguigu.tingshu.query.album.AlbumInfoQuery;
import com.atguigu.tingshu.vo.album.AlbumAttributeValueVo;
import com.atguigu.tingshu.vo.album.AlbumInfoVo;
import com.atguigu.tingshu.vo.album.AlbumListVo;
import com.atguigu.tingshu.vo.base.PageVo;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

@Slf4j
@Service
@SuppressWarnings({"unchecked", "rawtypes"})
public class AlbumInfoServiceImpl extends ServiceImpl<AlbumInfoMapper, AlbumInfo> implements AlbumInfoService {

	@Autowired
	private AlbumInfoMapper albumInfoMapper;
	@Resource
	AlbumAttributeValueMapper albumAttributeValueMapper;
	@Resource
	AlbumStatMapper albumStatMapper;

	/**
	 * album_info 专辑表
	 *
	 * ​	a. 初始化userId 默认值1 为了后续能查到数据
	 *
	 * ​	b. 并设置初始化状态为审核通过
	 *
	 * ​	c. 如果是付费专辑则设置前五集为免费试看
	 *
	 * album_attribute_value 专辑属性值表
	 *
	 * ​	a. 设置专辑Id
	 *
	 * album_stat 专辑统计表
	 *
	 * ​	a. 初始化统计数目为0
	 * @param albumInfoVo
	 * @param userId
	 */
	@Override
	public void saveAlbumInfo(AlbumInfoVo albumInfoVo, Long userId) {
		//保存专辑
		AlbumInfo albumInfo=new AlbumInfo();
		BeanUtils.copyProperties(albumInfoVo,albumInfo);
//		albumInfo.setUserId(1L);
		albumInfo.setUserId(userId);
		albumInfo.setStatus(SystemConstant.ALBUM_STATUS_PASS);
		if (!SystemConstant.ALBUM_PAY_TYPE_FREE.equals(albumInfo.getPayType())){
			albumInfo.setTracksForFree(5);
		}
		albumInfoMapper.insert(albumInfo);
		//保存专辑的属性
		List<AlbumAttributeValueVo> albumAttributeValueVoList = albumInfoVo.getAlbumAttributeValueVoList();
		albumAttributeValueVoList.stream().forEach(albumAttributeValueVo -> {
			AlbumAttributeValue albumAttributeValue=new AlbumAttributeValue();
			BeanUtils.copyProperties(albumAttributeValueVo,albumAttributeValue);
			albumAttributeValue.setAlbumId(albumInfo.getId());
			albumAttributeValueMapper.insert(albumAttributeValue);
		});
		//初始化统计数据
		this.saveAlbumStat(albumInfo.getId(), SystemConstant.ALBUM_STAT_PLAY);
		this.saveAlbumStat(albumInfo.getId(), SystemConstant.ALBUM_STAT_SUBSCRIBE);
		this.saveAlbumStat(albumInfo.getId(), SystemConstant.ALBUM_STAT_BROWSE);
		this.saveAlbumStat(albumInfo.getId(), SystemConstant.ALBUM_STAT_COMMENT);


	}

	/**
	 * 查询数据的时候，我们将页面渲染的数据封装到一个实体类中AlbumListVo，
	 * 只需要返回这个类的集合即可！
	 * @param page
	 * @param limit
	 * @param albumInfoQuery
	 * @return
	 */
	@Override
	public PageVo<AlbumListVo> findUserAlbumPage(Long page, Long limit, AlbumInfoQuery albumInfoQuery) {
		Page<AlbumInfo> albumInfoPage=new Page<>(page,limit);
		QueryWrapper<AlbumInfo> queryWrapper=new QueryWrapper<>();
		queryWrapper.eq(!StringUtils.isEmpty(albumInfoQuery.getUserId()),"user_id",albumInfoQuery.getUserId());
		queryWrapper.eq(!StringUtils.isEmpty(albumInfoQuery.getAlbumTitle()),"album_title",albumInfoQuery.getAlbumTitle());
		queryWrapper.eq(!StringUtils.isEmpty(albumInfoQuery.getStatus()),"status",albumInfoQuery.getStatus());
		albumInfoMapper.selectPage(albumInfoPage,queryWrapper);
		List<AlbumListVo> list=new ArrayList<>();
		List<AlbumInfo> albumInfoList = albumInfoPage.getRecords();
		albumInfoList.stream().forEach(albumInfo -> {
			AlbumListVo albumListVo=new AlbumListVo();
			albumListVo.setAlbumId(albumInfo.getId());
			albumListVo.setAlbumTitle(albumInfo.getAlbumTitle());
			albumListVo.setCoverUrl(albumInfo.getCoverUrl());
			albumListVo.setIncludeTrackCount(albumInfo.getIncludeTrackCount());
			albumListVo.setIsFinished(albumInfo.getIsFinished());
			albumListVo.setStatus(albumInfo.getStatus());
			//@Schema(description = "播放量")
			//	private Integer playStatNum;
			Integer playStatNum = this.selectAlbumStat(albumInfo.getId(), SystemConstant.ALBUM_STAT_PLAY);
			Integer subscribeStatNum = this.selectAlbumStat(albumInfo.getId(), SystemConstant.ALBUM_STAT_SUBSCRIBE);
			Integer buyStatNum = this.selectAlbumStat(albumInfo.getId(), SystemConstant.ALBUM_STAT_BROWSE);
			Integer albumCommentStatNum = this.selectAlbumStat(albumInfo.getId(), SystemConstant.ALBUM_STAT_COMMENT);
			albumListVo.setPlayStatNum(playStatNum);
			//
			//	@Schema(description = "订阅量")
			//	private Integer subscribeStatNum;
			albumListVo.setSubscribeStatNum(subscribeStatNum);
			//
			//	@Schema(description = "购买量")
			//	private Integer buyStatNum;
			albumListVo.setBuyStatNum(buyStatNum);
			//
			//	@Schema(description = "评论数")
			//	private Integer albumCommentStatNum;
			albumListVo.setCommentStatNum(albumCommentStatNum);
			list.add(albumListVo);
		});
		PageVo<AlbumListVo> pageVo=new PageVo<>(list,albumInfoPage);

		return pageVo;
	}
	//根据id删除专辑
	@Override
	public void removeAlbumInfoById(Long id) {
		//	删除专辑表的数据 album_info
		albumInfoMapper.deleteById(id);
		//	删除专辑属性信息
		QueryWrapper<AlbumAttributeValue> albumAttributeValueQueryWrapper=new QueryWrapper<>();
		albumAttributeValueQueryWrapper.eq("album_id",id);
		albumAttributeValueMapper.delete(albumAttributeValueQueryWrapper);
		//	删除专辑对应的统计数据
		QueryWrapper<AlbumStat> albumStatQueryWrapper=new QueryWrapper<>();
		albumStatQueryWrapper.eq("album_id",id);
		albumStatMapper.delete(albumStatQueryWrapper);
	}

	/**
	 * 需要根据专辑id获取到对应的回显数据，
	 * 需要回显专辑与属性数据，不需要回显统计数据！
	 * @param id
	 * @return
	 */
	@Override
	public AlbumInfo getAlbumInfoById(Long id) {
		AlbumInfo albumInfo = albumInfoMapper.selectById(id);
		if (albumInfo!=null){
			QueryWrapper<AlbumAttributeValue> queryWrapper=new QueryWrapper<>();
			queryWrapper.eq("album_id",id);
			List<AlbumAttributeValue> albumAttributeValueList = albumAttributeValueMapper.selectList(queryWrapper);
			albumInfo.setAlbumAttributeValueVoList(albumAttributeValueList);
		}
		return albumInfo;
	}

	/**
	 * album_info	根据主键进行更新
	 *
	 * album_attribute_value  先删除所有数据，再新增数据
	 * @param id
	 * @param albumInfoVo
	 */
	@Override
	public void updateAlbumInfo(Long id, AlbumInfoVo albumInfoVo) {
		//album_info	根据主键进行更新
		AlbumInfo albumInfo = this.getById(id);
		BeanUtils.copyProperties(albumInfoVo,albumInfo);
		albumInfoMapper.updateById(albumInfo);
		//album_attribute_value  先删除所有数据，再新增数据
		albumAttributeValueMapper.delete(new LambdaQueryWrapper<AlbumAttributeValue>().eq(AlbumAttributeValue::getAlbumId,albumInfo.getId()));
		List<AlbumAttributeValueVo> albumAttributeValueVoList = albumInfoVo.getAlbumAttributeValueVoList();
		if (!CollectionUtils.isEmpty(albumAttributeValueVoList)){
			albumAttributeValueVoList.stream().forEach(albumAttributeValueVo -> {
				AlbumAttributeValue albumAttributeValue=new AlbumAttributeValue();
				BeanUtils.copyProperties(albumAttributeValueVo,albumAttributeValue);
				albumAttributeValue.setAlbumId(id);
				albumAttributeValueMapper.insert(albumAttributeValue);
			});
		}
	}

	/**
	 * 主要是根据userId,查询专辑Id 与专辑标题，然后按照专辑Id 进行降序排列
	 * @param userId
	 * @return
	 */
	@Override
	public List<AlbumInfo> findUserAllAlbumList(Long userId) {

		return albumInfoMapper.selectList(new LambdaQueryWrapper<AlbumInfo>().eq(AlbumInfo::getUserId,userId).select(AlbumInfo::getId,AlbumInfo::getAlbumTitle).orderByDesc(AlbumInfo::getId));
	}

	public void saveAlbumStat(Long albumId,String statType){
		AlbumStat albumStat=new AlbumStat();
		albumStat.setAlbumId(albumId);
		albumStat.setStatType(statType);
		albumStat.setStatNum(0);
		albumStatMapper.insert(albumStat);
	}
	public Integer selectAlbumStat(Long albumId,String statType){
		QueryWrapper<AlbumStat> queryWrapper=new QueryWrapper<>();
//		queryWrapper.select("stat_num");
		queryWrapper.eq("album_id",albumId);
		queryWrapper.eq("stat_type",statType);
		AlbumStat albumStat = albumStatMapper.selectOne(queryWrapper);
		return albumStat.getStatNum();
	}
}
